package com.levi.juc.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.SynchronousQueue;

/**
 * Callbale   第三种创建线程的方法
 * Callable跟runable的区别
 * 1.callable有返回值
 * 2.callable可以抛出异常
 * 3.方法不同calllable中是call方法
 *
 * 注意:callable不能直接跟Thread关联   要通过runable的实现类 FutureTask进行关联
 * 实例化实现calllable的线程对象，把线程对象扔进futuretask中，再把futureTask对象扔进Thread中，然就start就可以开启线程了
 */
public class CallableTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyThread myThread = new MyThread();
        //通过自定义线程创建一个futureTask
        FutureTask futureTask = new FutureTask(myThread);
        //吧futureTask放进Thread，开启线程
        new Thread(futureTask).start();
        //获得callable的返回值
        Integer o = (Integer) futureTask.get();//get方法可能会被阻塞,如果call方法耗时太多的话
        System.out.println(o);
    }
}

/**
 * MyThread类实现Callable接口
 */
class MyThread implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        System.out.println("call()");
        return 1204;
    }
}
